/***************************************************************************
 *   Copyright (C) 2005 by xihe   *
 *   xihels@163.com                                                        *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/
#ifndef _QQ_H_
#define _QQ_H_
#include <stdint.h>
/**
 * 定义一些QQ用到的常量
 */
/** 空字符串 */

/** 基本协议族输入包的包头长度 */
#define QQ_HEADER_LENGTH_BASIC_FAMILY_IN 	 7
/** 基本协议族输出包的包头长度 */
#define QQ_HEADER_LENGTH_BASIC_FAMILY_OUT 	 11
/** 群操作输入包的包头长度 */
#define QQ_HEADER_LENGTH_CLUSTER_IN	9
/** 基本协议族输入包的包尾长度 */
#define QQ_TAIL_LENGTH_BASIC_FAMILY_IN 	 1
/** 基本协议族输出包的包尾长度 */
#define QQ_TAIL_LENGTH_BASIC_FAMILY_OUT	 1

// 代理类型，和协议没有关系
/** 代理类型 - 无代理 */
#define PROXY_NONE 	 0
/** 代理类型 - Socks5代理 */
#define PROXY_SOCKS5 	 1
/** 代理类型 - Http代理 */
#define PROXY_HTTP 	 2

/** 不需要确认的包的发送次数，这个值应该是随便的，由于QQ Logout包发了4次，所以我选4 */ 
#define QQ_ACK_PACKET_SEND_TIME 	 4

/** QQ登录包中16到51字节的固定内容 */
static const uint8_t LOGIN_16_51[] = {
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x4c, 0x28, 0xeb, 0xaa, 0xe9, 
    0x7f, 0x2a, 0x7c, 0xf9, 0xa9, 0x0f, 0x84, 0xdd, 
    0xbb, 0xb2, 0x0f, 0x01
};

/** QQ登录包中53到68字节的固定内容 */
static const uint8_t LOGIN_53_68[] = {
    0x43, 0xc3, 0x80, 0x19, 0x46, 0x05, 0x3e, 0x4b, 
    0x91, 0x60, 0x5b, 0xf8, 0x17, 0xd7, 0xf3, 0x5b
};

/** QQ登录包中的未知固定内容 */
static const uint8_t LOGIN_SEGMENTS[] = {
    0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00
};

/** 包最大大小 */
#define MAX_PACKET_SIZE 	 65535
/** 消息最大长度 */
#define MAX_SEND_IM_SIZE 	 600
/** 密钥长度 */
#define QQ_KEY_LENGTH 	 16
/** 旧的登陆信息长度 */
#define QQ_LOGIN_DATA_OLD_LENGTH 	 416
/** 默认的登陆信息长度 */
#define QQ_LOGIN_DATA_LENGTH 	 QQ_LOGIN_DATA_0F5F_LENGTH
/** QQ default login request last trunck */
#define QQ_LOGIN_APPEND_LENGTH	 QQ_LOGIN_APPEND_0F5F_LENGTH

/** QQ头部tag , unsigned char (1 byte) */
#define QQ_PACKET_TAG 0x02
/** QQ 尾部字节 */
#define QQ_PACKET_TAIL 0x03

/** QQ UDP缺省端口 */
#define QQ_UDP_PORT 	 8000
/** QQ TCP缺省端口 */
#define QQ_TCP_PORT 	 80
/** 使用HTTP代理时连接QQ服务器的端口 */
#define QQ_HTTP_PORT 	 443

/** QQ缺省编码方式 */
static const char QQ_CHARSET_DEFAULT[] = "GBK";
/** 消息编码，好像可以自己胡乱定义 */
#define QQ_IM_ENCODING_GB 	 0x8602
#define QQ_IM_ENCODING_EN 	 0x0000	
#define QQ_IM_ENCODING_BIG5 	 0x8603

/** 单位: ms */
#define QQ_SENDQUEUE_TIMEOUT 	 5000
/** 最大重发次数 */
#define QQ_RESEND_MAX 	 5
/** Keep Alive包发送间隔，单位: ms */
#define QQ_KEEP_ALIVE_INTERVAL 	 60000

// 和虚拟摄像头有关系
/** 显示虚拟摄像头 */
#define QQ_SHOW_FAKE_CAM 	 1
/** 隐藏虚拟摄像头 */
#define QQ_DONT_SHOW_FAKE_CAM 	 0

/** QQ分组的名称最大字节长度，注意一个汉字是两个字节 */
#define QQ_MAX_GROUP_NAME_BYTE 	 16
/** QQ昵称的最长长度 */
#define QQ_NAME_LENGTH_MAX 	 250
/** QQ消息的最长长度 */
#define QQ_MSG_IM_MAX 	 1500
/** QQ缺省表情个数 */
#define QQ_SMILEY_AMOUNT 	 96
/** 用户的信息的字段个数 */
#define QQ_CONTACT_FIELDS 	 37
/** 用户备注信息的字段个数 ,eva 中这个字段似乎叫QQ_MEMO_FIELDS */
#define QQ_REMARK_FIELDS 	 7

/** 客户端版本号标志 - QQ20003 III */
#define QQ_CLIENT_0B37 	 0x0B37
/** 客户端版本号标志 - QQ2004 */
#define QQ_CLIENT_0C21 	 0x0C21
/** 客户端版本号标志 - TM 2.5 Build 0714 */
#define QQ_CLIENT_TM_0C14 	 0x0C14
/** 客户端版本号标志 - QQ2004II */
#define QQ_CLIENT_0C49  0x0C49
/** 客户端版本号标志 - QQ2005 beta1 */
#define QQ_CLIENT_0D05  0x0D05
/** 客户端版本号标志 - QQ2005 beta2 */
#define QQ_CLIENT_0D51  0x0D55
/** 客户端版本号标志 - QQ2005 */
#define QQ_CLIENT_0D61  0x0D61
/** 客户端版本号标志 - QQ2005 ? */
#define QQ_CLIENT_0E1B   0x0E1B
/** ? */
#define QQ_CLIENT_05A5   0x05A5
/** 客户端版本号标志 - QQ2006 Spring Festival */
#define QQ_CLIENT_05F1   0x0F15
/** 客户端版本号标志 - QQ2006 Beta 3  */
#define QQ_CLIENT_0F4B   0x0F4B

/** 客户端版本号标志 - QQ2006 standard */
#define QQ_CLIENT_0F5F   0x0F5F

/** 2006的一些字节*/
#define QQ_LOGIN_DATA_0F5F_LENGTH         449
#define QQ_LOGIN_RESERVE_0F5F_LENGTH    0x13
#define QQ_LOGIN_APPEND_0F5F_LENGTH     0x0140
/**
 * 服务器端版本号 (不一定)
 * 不一定真的是表示服务器端版本号，似乎和发出的包不同，这个有其他的含义，
 * 感觉像是包的类型标志
 */
#define QQ_SERVER_0100 	 0x0100
/**
 * 服务器端版本号 (不一定)
 * 不一定真的是表示服务器端版本号，似乎和发出的包不同，这个有其他的含义，
 * 感觉像是包的类型标志
 */
#define QQ_SERVER_0000 	 0x0000

/** 程序缺省使用的客户端版本号 */
#define QQ_CLIENT 	 QQ_CLIENT_0F5F

// QQ包类型定义
//#define 
/** QQ基本协议族包头 */
#define QQ_HEADER_BASIC_FAMILY 	 0x02
/** QQ P2P协议族 */
#define QQ_HEADER_P2P_FAMILY 	 0x00
/** 03开头的协议族，未知含义，文件传输时的数据消息有用到一些 */
#define QQ_HEADER_03_FAMILY 	 0x03
/** 04开头的协议族，未知含义，文件中转包有用到过 */
#define QQ_HEADER_04_FAMILY 	 0x04
/** 05开头的协议族，未知含义，群内贴图有用到 */
#define QQ_HEADER_05_FAMILY 	 0x05
/** QQ基本协议族包尾 */
#define QQ_TAIL_BASIC_FAMILY 	 0x03

/** 正常登陆 */
#define QQ_LOGIN_MODE_NORMAL 	 0x0A
/** 隐身登陆 */
#define QQ_LOGIN_MODE_HIDDEN 	 0x28
/** 性别-男 */
#define QQ_FRIEND_GENDER_GG 	 0x0
/** 性别-女 */
#define QQ_FRIEND_GENDER_MM 	 0x1
/** 性别-未知 */
#define QQ_FRIEND_GENDER_UNKNOWN 	  0xFF

/** 标志-QQ会员 */
#define QQ_FRIEND_FLAG_QQ_MEMBER 	 0x01
/** 标志-手机 */
#define QQ_FRIEND_FLAG_MOBILE 	 0x10
/** 标志-手机绑定 */
#define QQ_FRIEND_FLAG_BIND_MOBILE 	 0x20

/** 在线状态-在线 */
#define QQ_FRIEND_STATUS_ONLINE 	 10
/** 在线状态-离线 */
#define QQ_FRIEND_STATUS_OFFLINE 	 20
/** 在线状态-离开 */
#define QQ_FRIEND_STATUS_AWAY		 30
/** 在线状态-隐身 */
#define QQ_FRIEND_STATUS_HIDDEN 	 40

/** 是否有摄像头(这是虚拟摄像头功能) */
#define QQ_MISC_STATUS_HAVING_VIDEO 	 0x00000001

/** 请求登录令牌成功 */
#define QQ_REQUEST_LOGIN_TOKEN_REPLY_OK 	 0x00
/** 登录信息-成功 */
#define QQ_LOGIN_REPLY_OK 	 0x00
/** 登录信息-重定向 */
#define QQ_LOGIN_REPLY_REDIRECT 	 0x01
/** 登录信息-密码错误 */
#define QQ_LOGIN_REPLY_PASSWORD_ERROR 	 0x05
/** 登录信息-需要激活 */
#define QQ_LOGIN_REPLY_NEED_REACTIVATE   0x06
/** 登录信息-密码错误？ */
#define QQ_LOGIN_REPLY_PWD_ERROR_EX 	 0x09
/** 登录信息-重定向? */
#define QQ_LOGIN_REPLY_REDIRECT_EX 	 0x0A

/** 上载好友分组成功 */
#define QQ_UPLOAD_GROUP_FRIEND_REPLY_OK 	 0x00
/** 下载好友分组成功 */
#define QQ_DOWNLOAD_GROUP_FRIEND_REPLY_OK 	 0x00
/** 好友数据操作成功 */
#define QQ_FRIEND_DATA_OP_OK 	 0x00
/** 分组数组操作成功 */
#define QQ_GROUP_DATA_OP_OK 	 0x00
/** 改变在线状态成功 */
#define QQ_CHANGE_STATUS_REPLY_OK 	 0x30
/** 发送消息成功 */
#define QQ_SEND_IM_REPLY_OK 	 0x00
/** 发送认证消息成功 */
#define QQ_ADD_FRIEND_AUTH_REPLY_OK 	 0x30
/** 删除好友成功 */
#define QQ_DELETE_FRIEND_REPLY_OK 	 0x00
/** 把自己从对方好友中删除成功 */
#define QQ_REMOVE_SELF_REPLY_OK 	 0x00
/** 得到密钥成功 */
#define QQ_REQUEST_KEY_REPLY_OK 	 0x00

/** 好友列表从第一个好友开始 */
#define QQ_FRIEND_LIST_POSITION_START 	 0x0000
/** 好友列表已经全部得到 */
#define QQ_FRIEND_LIST_POSITION_END 	 0xFFFF
/** 在线好友列表从第一个好友开始 */
#define QQ_FRIEND_ONLINE_LIST_POSITION_START 	 0x00
/** 在线好友列表已经全部得到 */
#define QQ_FRIEND_ONLINE_LIST_POSITION_END 	 0xFF	
/** 不对得到的好友列表排序 */
#define QQ_FRIEND_LIST_UNSORTED 	 0
/** 对得到的好友列表排序 */
#define QQ_FRIEND_LIST_SORTED 	 1

/** 命令常量 - 登出 */
#define QQ_CMD_LOGOUT 	 0x0001
/** 命令常量 - 保持在线状态 */
#define QQ_CMD_KEEP_ALIVE 	 0x0002
/** 命令常量 - 修改自己的信息 */
#define QQ_CMD_MODIFY_INFO 	 0x0004
/** 命令常量 - 查找用户 */
#define QQ_CMD_SEARCH_USER 	 0x0005
/** 命令常量 - 得到好友信息 */
#define QQ_CMD_GET_USER_INFO 	 0x0006
/** 命令常量 - 添加一个好友 */
#define QQ_CMD_ADD_FRIEND 	 0x0009
/** 命令常量 - 删除一个好友 */
#define QQ_CMD_DELETE_FRIEND 	 0x000A
/** 命令常量 - 发送验证信息 */
#define QQ_CMD_ADD_FRIEND_AUTH 	 0x000B
/** 命令常量 - 改变自己的在线状态 */
#define QQ_CMD_CHANGE_STATUS 	 0x000D
/** 命令常量 - 确认收到了系统消息 */
#define QQ_CMD_ACK_SYS_MSG 	 0x0012
/** 命令常量 - 发送消息 */
#define QQ_CMD_SEND_IM 	 0x0016
/** 命令常量 - 接收消息 */
#define QQ_CMD_RECV_IM 	 0x0017
/** 命令常量 - 把自己从对方好友名单中删除 */
#define QQ_CMD_REMOVE_SELF 	 0x001C
/** 请求一些操作需要的密钥，比如文件中转，视频也有可能 */
#define QQ_CMD_REQUEST_KEY 	 0x001D
/** 命令常量 - 登陆 */
#define QQ_CMD_LOGIN 	 0x0022
/** 命令常量 - 得到好友列表 */
#define QQ_CMD_GET_FRIEND_LIST 	 0x0026
/** 命令常量 - 得到在线好友列表 */
#define QQ_CMD_GET_FRIEND_ONLINE 	 0x0027
/** 命令常量 - 发送短消息 */
#define QQ_CMD_SEND_SMS 	 0x002D
/** 命令常量 - 群相关命令 */
#define QQ_CMD_CLUSTER_CMD 	 0x0030
/** 命令常量 - 测试连接 */
#define QQ_CMD_TEST 	 0x0031
/** 命令常量 - 分组数组操作 */
#define QQ_CMD_GROUP_DATA_OP 	 0x003C
/** 命令常量 - 上传分组中的好友QQ号列表 */
#define QQ_CMD_UPLOAD_GROUP_FRIEND 	 0x003D
/** 命令常量 - 好友相关数据操作 */
#define QQ_CMD_FRIEND_DATA_OP 	 0x003E
/** 命令常量 - 下载分组中的好友QQ号列表 */
#define QQ_CMD_DOWNLOAD_GROUP_FRIEND 	 0x0058
/** 命令常量 - 得到好友等级 */
#define QQ_CMD_GET_LEVEL	0x005C 
/** 命令常量 - 未知命令1 */
#define QQ_CMD_UNKNOWN_1 	 0x005F
/** 命令常量 - 好友高级查找 */
#define QQ_CMD_ADVANCED_SEARCH 	 0x0061
/** 命令常量 - 请求登录令牌 */
#define QQ_CMD_REQUEST_LOGIN_TOKEN 	 0x0062
#define QQ_CMD_REQUEST_EXTRA_INFORMATION          0x0065
#define QQ_CMD_TEMP_SESSION_OP                    0x0066
#define QQ_CMD_SIGNATURE_OP                       0x0067
/** 命令常量 - 接收到系统消息 */
#define QQ_CMD_RECV_MSG_SYS 	 0x0080
/** 命令常量 - 好友改变状态 */
#define QQ_CMD_RECV_MSG_FRIEND_CHANGE_STATUS 	 0x0081
#define QQ_CMD_SERVER_DETECT                      0x0091
#define QQ_CMD_WEATHER                            0x00A6
#define QQ_CMD_ADD_FRIEND_EX                      0x00A7
#define QQ_CMD_ADD_FRIEND_AUTH_EX                 0x00A8
#define QQ_CMD_ADD_FRIEND_AUTH_INFO               0x00AE
#define QQ_CMD_VERIFY_ADDING_MSG                  0x00B5
#define QQ_CMD_ADD_FRIEND_AUTH_QUESTION           0x00B7
#define QQ_CMD_REQUEST_LOGIN_TOKEN_EX             0x00BA
#define QQ_CMD_LOGIN_LOCATION_CHECK               0x00DA
/** 命令常量 - 未知命令，调试用途 */
#define QQ_CMD_UNKNOWN 	 0xFFFF

/** 请求密钥类型 - 未知 */
#define QQ_REQUEST_UNKNOWN_KEY 	 0x3
/** 请求密钥类型 - 文件中转密钥 */
#define QQ_REQUEST_FILE_AGENT_KEY 	 0x4

/** 群操作命令 - 创建群 */
#define QQ_CLUSTER_CMD_CREATE_CLUSTER		 0x01
/** 群操作命令 - 修改群成员 */
#define QQ_CLUSTER_CMD_MODIFY_MEMBER		 0x02
/** 群操作命令 - 修改群资料 */
#define QQ_CLUSTER_CMD_MODIFY_CLUSTER_INFO	 0x03
/** 群操作命令 - 得到群资料 */
#define QQ_CLUSTER_CMD_GET_CLUSTER_INFO	 0x04
/** 群操作命令 - 激活群 */
#define QQ_CLUSTER_CMD_ACTIVATE_CLUSTER	 0x05
/** 群操作命令 - 搜索群 */
#define QQ_CLUSTER_CMD_SEARCH_CLUSTER		 0x06
/** 群操作命令 - 加入群 */
#define QQ_CLUSTER_CMD_JOIN_CLUSTER		 0x07
/** 群操作命令 - 加入群的验证消息 */
#define QQ_CLUSTER_CMD_JOIN_CLUSTER_AUTH	 0x08
/** 群操作命令 - 退出群 */
#define QQ_CLUSTER_CMD_EXIT_CLUSTER		 0x09
/** 群操作命令 - 发送群消息 */
#define QQ_CLUSTER_CMD_SEND_IM				 0x0A
/** 群操作命令 - 得到在线成员 */
#define QQ_CLUSTER_CMD_GET_ONLINE_MEMBER	 0x0B
/** 群操作命令 - 得到成员资料 */
#define QQ_CLUSTER_CMD_GET_MEMBER_INFO		 0x0C
/** 群操作命令 - 扩展格式的群消息 */
#define QQ_CLUSTER_CMD_SEND_IM_EX 			 0x1A
/** 群操作命令 - 创建临时群 */
#define QQ_CLUSTER_CMD_CREATE_TEMP_CLUSTER 	 0x30
/** 群操作命令 - 修改临时群成员列表 */
#define QQ_CLUSTER_CMD_MODIFY_TEMP_CLUSTER_MEMBER 	 0x31
/** 群操作命令 - 退出临时群 */
#define QQ_CLUSTER_CMD_EXIT_TEMP_CLUSTER 	 0x32
/** 群操作命令 - 得到临时群资料 */
#define QQ_CLUSTER_CMD_GET_TEMP_CLUSTER_INFO 	 0x33
/** 群操作命令 - 发送临时群消息 */
#define QQ_CLUSTER_CMD_SEND_TEMP_CLUSTER_IM 	 0x35
/** 群操作命令 - 得到临时群成员列表 */
#define QQ_CLUSTER_CMD_GET_TEMP_CLUSTER_MEMBERS 	 0x37
/** 群操作命令回复 - 成功 */
#define QQ_CLUSTER_CMD_REPLY_OK					 0x00
/** 群操作命令回复 - 不存在这个群 */
#define QQ_CLUSTER_CMD_REPLY_NO_SUCH_CLUSTER		 0x02
/** 群操作命令回复 - 群已经被删除 */
#define QQ_CLUSTER_CMD_REPLY_TEMP_CLUSTER_REMOVED 	 0x03
/** 群操作命令回复 - 你已经不是临时群的成员 */
#define QQ_CLUSTER_CMD_REPLY_NOT_TEMP_CLUSTER_MEMBER 	 0x04
/** 群操作命令回复 - 你已经不是固定群的成员 */
#define QQ_CLUSTER_CMD_REPLY_NOT_CLUSTER_MEMBER  	  	 0x0a
/** 群类型常量 - 固定群 */
#define QQ_CLUSTER_TYPE_PERMANENT 	 0x01
/** 临时群类型常量 - 多人对话 */
#define QQ_TEMP_CLUSTER_TYPE_MULTI_TALK 	 0x01
/** 临时群类型常量 - 讨论组 */
#define QQ_TEMP_CLUSTER_TYPE_DISCUSSION_GROUP 	 0x02
/** 群操作子命令 - 添加成员，用在修改成员列表命令中 */
#define QQ_CLUSTER_MEMBER_ADD 	 0x01
/** 群操作子命令 - 删除成员，用在修改成员列表命令中 */
#define QQ_CLUSTER_MEMBER_REMOVE 	 0x02
/** 群认证类型 - 不需认证 */
#define QQ_CLUSTER_NO_AUTH		 0x01
/** 群认证类型 - 需要认证 */
#define QQ_CLUSTER_NEED_AUTH   	 0x02
/** 群认证类型 - 拒绝任何人加入 */
#define QQ_CLUSTER_NO_ADD  	 0x03
/** 群认证消息类型 - 请求加入群 */
#define QQ_CLUSTER_AUTH_REQUEST   	 0x01
/** 群认证消息类型 - 同意加入群 */
#define QQ_CLUSTER_AUTH_APPROVE   	 0x02
/** 群认证消息类型 - 拒绝加入群 */
#define QQ_CLUSTER_AUTH_REJECT    	 0x03
/** 加入群的回复码 - 加入成功 */
#define QQ_CLUSTER_JOIN_OK			 0x01	
/** 加入群的回复码 - 对方需要认证 */
#define QQ_CLUSTER_JOIN_NEED_AUTH	 0x02
/** 加入群的回复码 - 群禁止加入 */
#define QQ_CLUSTER_JOIN_DENIED 	 0x03
/** 群的搜索方式 - 根据群号搜索 */
#define QQ_SEARCH_CLUSTER_BY_ID 	 0x01
/** 群的搜索方式 - 搜索示范群 */
#define QQ_SEARCH_DEMO_CLUSTER		 0x02

/** 消息回复类型 - 正常回复 */
#define QQ_IM_NORMAL_REPLY 	 0x01
/** 消息回复类型 - 自动回复 */
#define QQ_IM_AUTO_REPLY 	 0x02
/** 消息回复类型 - 图片回复 */
#define QQ_IM_IMAGE_REPLY 	 0x05

// 消息来源，主要是MessageQueue使用，和协议关系不大
/** 来自好友 */
#define QQ_IM_FROM_USER 	 0
/** 来自系统 */
#define QQ_IM_FROM_SYS 	 1
/** 来自群 */
#define QQ_IM_FROM_CLUSTER 	 2
/** 来自短消息 */
#define QQ_IM_FROM_SMS 	 3

// 子命令常量，服务于命令0x003C
/** 服务器端数据操作 - 上传组名 */
#define QQ_UPLOAD_GROUP_NAME 	 0x2
/** 服务器端数据操作 - 下载组名 */
#define QQ_DOWNLOAD_GROUP_NAME 	 0x1

// 子命令常量，服务于命令0x003E
/** 服务器端数据操作 - 批量下载好友备注 */
#define QQ_BATCH_DOWNLOAD_FRIEND_REMARK 	 0x0
/** 服务器端数据操作 - 上传好友备注 */
#define QQ_UPLOAD_FRIEND_REMARK 	 0x1
/** 服务器端数据操作 - 添加好友到列表中 */
#define QQ_REMOVE_FRIEND_FROM_LIST 	 0x2
/** 服务器端数据操作 - 下载好友备注 */
#define QQ_DOWNLOAD_FRIEND_REMARK 	 0x3

// 这两个常量用在下载好友分组时
/** 号码类型 - 号码代表一个用户 */
#define QQ_ID_IS_FRIEND 	 0x1
/** 号码类型 - 号码是一个群 */
#define QQ_ID_IS_CLUSTER 	 0x4

// 消息类型，就是ReceiveIMHeader中的类型，对于有些类型，我们做为通知来处理
//    而不是显示在消息窗口中，比如请求加入，验证之类的消息
/** 来自好友的消息 */
#define QQ_RECV_IM_FROM_FRIEND 	 0x0009
/** 来自陌生人的消息 */
#define QQ_RECV_IM_FROM_STRANGER 	 0x000A
/** 手机短消息 - 普通绑定用户 */
#define QQ_RECV_IM_SMS 	 0x000B
/** 手机短消息 - 移动QQ用户 */
#define QQ_RECV_IM_MOBILE_QQ 	 0x0013

#define QQ_RECV_IM_NEWS		0x0018
#define QQ_RECV_IM_FROM_BUDDY_2006 0x0084
#define QQ_RECV_IM_FROM_UNKNOWN_2006 0x0085

//群里的某人发信息给你？
#define QQ_RECV_IM_TO_IM_CLUSTER     0x001F
/** 未知类型的群消息 */
#define QQ_RECV_IM_UNKNOWN_CLUSTER_IM 	 0x0020
/** 通知我被加入到一个群，这个群先前已经建立，我是后来被加的 */
#define QQ_RECV_IM_ADDED_TO_CLUSTER 	 0x0021
/** 我被踢出一个群 */
#define QQ_RECV_IM_DELETED_FROM_CLUSTER 	 0x0022
/** 有人请求加入群 */
#define QQ_RECV_IM_REQUEST_JOIN_CLUSTER 	 0x0023
/** 同意对方加入群 */	
#define QQ_RECV_IM_APPROVE_JOIN_CLUSTER 	 0x0024
/** 拒绝对方加入群 */
#define QQ_RECV_IM_REJECT_JOIN_CLUSTER 	 0x0025
/** 通知我被加入到一个群，我是在群被创建的时候就被加的 */
#define QQ_RECV_IM_CREATE_CLUSTER 	 0x0026
/** 临时群消息 */
#define QQ_RECV_IM_TEMP_CLUSTER_IM 	 0x002A
/** 固定群消息 */
#define QQ_RECV_IM_CLUSTER_IM 	 0x002B
/** 收到的系统消息 */ 
#define QQ_RECV_IM_SYS_MESSAGE 	 0x0030
#define QQ_RECV_IM_SIGNATURE_CHANGED  0x0041

// 系统消息类型
/** 同一个QQ号在其他地方登录，我被踢出 */
#define QQ_RECV_IM_KICK_OUT 	 0x01

// 消息类型，这个类型比上面的类型又再低一级，他们基本从属于QQ_RECV_IM_TO_BUDDY
//    所以他们是normalIMHeader中的类型
/** 一个TCP连接请求 */
#define QQ_IM_TCP_REQUEST 	 0x0001
/** 接收TCP连接请求 */
#define QQ_IM_ACCEPT_TCP_REQUEST 	 0x0003
/** 拒绝TCP连接请求 */
#define QQ_IM_REJECT_TCP_REQUEST 	 0x0005
/** 普通文件消息 */
#define QQ_IM_NORMAL_TEXT 	 0x000B
/** UDP连接请求 */
#define QQ_IM_UDP_REQUEST 	 0x0035
/** 接受UDP连接请求 */
#define QQ_IM_ACCEPT_UDP_REQUEST 	 0x0037
/** 拒绝UDP连接请求 */
#define QQ_IM_REJECT_UDP_REQUEST 	 0x0039
/** 通知文件传输端口 */
#define QQ_IM_NOTIFY_IP 	 0x003B
/** 请求对方主动连接 */
#define QQ_IM_ARE_YOU_BEHIND_FIREWALL 	 0x003F
/** 未知含意 */
#define QQ_IM_ARE_YOU_BEHIND_PROXY 	 0x0041
/** 未知含意，0x0041的回复 */
#define QQ_IM_YES_I_AM_BEHIND_PROXY 	 0x0042
/** 通知文件中转服务器信息 */
#define QQ_IM_NOTIFY_FILE_AGENT_INFO 	 0x004B
/** 取消TCP或者UDP连接请求 */
#define QQ_IM_REQUEST_CANCELED 	 0x0049

// 以下常量用于QQ短信功能
/** 短消息发送者最大名称字节长度 */
#define QQ_SMS_SENDER_NAME_MAX_LENGTH 	 13
/** 发送模式 - 免提短信 */
#define QQ_SMS_HAND_FREE 	 0x20
/** 发送模式 - 普通 */
#define QQ_SMS_NORMAL 	 0x00
/** 短消息内容 - 普通短消息 */
#define QQ_SMS_CONTENT_NORMAL 	 0x00
/** 短消息内容 - 言语传情 */
#define QQ_SMS_CONTENT_LOVE_WORD 	 0x01
/** 短消息内容 - 精美图片 */
#define QQ_SMS_CONTENT_PICTURE 	 0x02
/** 短消息内容 - 悦耳铃声 */
#define QQ_SMS_CONTENT_RING 	 0x03

// 短信接收者类型
/** 接收者类型 - 绑定用户 */
#define QQ_SMS_DESTINATION_BIND_USER 	 0x00
/** 接收者类型 - 非绑定用户 */
#define QQ_SMS_DESTINATION_NOT_BIND_USER 	 0x01

// 这些回复码是1字节，用在向绑定手机用户发送短消息的回复中
/** 回复 - 发送成功 */
#define QQ_SMS_REPLY_OK_1 	 0x00
/** 回复 - 未绑定手机 */
#define QQ_SMS_REPLY_NOT_BIND_1 	 0x01
/** 回复 - 好友未绑定手机 */
#define QQ_SMS_REPLY_FRIEND_NOT_BIND_1 	 0x04

// 高级搜索的回复码
/** 搜索成功 */
#define QQ_ADVANCED_SEARCH_REPLY_OK 	 0
/** 没有更多数据 */
#define QQ_ADVANCED_SEARCH_REPLY_END 	 1

// 这些回复码是两字节，用在向非绑定手机用户发送短消息的回复中
/** 回复 - 发送成功 */
#define QQ_SMS_REPLY_OK_2 	 0x0000
/** 回复 - 无效的手机号码 */
#define QQ_SMS_REPLY_INVALID_NUMBER_2 	 0x0003

// 以下常量用于消息中的表情，对于自定义表情的表示格式参考NormalIM.java的注释
/** 缺省表情前导字节 */
#define QQ_DEFAULT_FACE_TAG 	 0x14
/** 自定义表情前导字节 */
#define QQ_CUSTOM_FACE_TAG 	 0x15
/** 该自定义表情在普通消息中第一次出现 */
#define QQ_CUSTOM_FACE_NEW 	 0x33
/** 该自定义表情在普通消息中已经出现过 */
#define QQ_CUSTOM_FACE_EXIST 	 0x34
/** 该自定义表情在群消息中第一次出现 */
#define QQ_CUSTOM_FACE_NEW_CLUSTER 	 0x36
/** 该自定义表情在群消息中已经出现过, 2004协议 */
#define QQ_CUSTOM_FACE_EXIST_CLUSTER 	 0x37
/** 自定义表情类型1，未知含义 */
#define QQ_CUSTOM_FACE_TYPE_1 	 0x38
/** 自定义表情类型2，未知含义 */
#define QQ_CUSTOM_FACE_TYPE_2 	 0x39

// 认证类型，加一个人为好友时是否需要验证等等
/** 不需认证 */
#define QQ_AUTH_NO_AUTH 	 0
/** 需要认证 */
#define QQ_AUTH_NEED_AUTH 	 1
/** 对方拒绝加好友 */
#define QQ_AUTH_NO_ADD 	 2

// 这三个常量用在添加好友认证的包中，表示你是请求，或者你拒绝还是同意别人的请求
/** 通过认证 */
#define QQ_MY_AUTH_APPROVE 	 0x30
/** 拒绝认证  */
#define QQ_MY_AUTH_REJECT 	 0x31
/** 请求认证 */
#define QQ_MY_AUTH_REQUEST 	 0x32

// 联系方法的可见类型
/** 完全公开 */
#define QQ_CONTACT_OPEN 	 0
/** 仅好友可见 */
#define QQ_CONTACT_ONLY_FRIENDS 	 1
/** 完全保密 */
#define QQ_CONTACT_CLOSE 	 2

// 系统通知的类型
/** 自己被别人加为好友 */
#define QQ_MSG_SYS_BEING_ADDED 	 1
/** 对方请求加你为好友 */
#define QQ_MSG_SYS_ADD_FRIEND_REQUEST 	 2
/** 同意对方加自己为好友 */
#define QQ_MSG_SYS_ADD_FRIEND_APPROVED 	 3
/** 拒绝对方加自己为好友 */
#define QQ_MSG_SYS_ADD_FRIEND_REJECTED 	 4
/** 未知含意 */
#define QQ_MSG_SYS_UPDATE_HINT 	 9

// 这是搜索用户时指定的搜索类类型，比如是查看全部在线用户，还是自定义查找
/** 看谁在线上 */
#define QQ_SEARCH_ALL 	 0x31
/** 自定义搜索 */
#define QQ_SEARCH_CUSTOM 	 0x30

/* 以下为专用于文件传输时的常量 */
/** 初始中转服务器，从这些初始的服务器开始请求，直到请求到一个愿意提供中转的服务器为止 */
static const char* originalAgents[] = {
    "218.133.40.38",
    "218.133.40.36",
    "219.133.40.36"
};
/** QQ文件传送包的头部字节长度 */
#define QQ_FILE_PACKET_HEADER_LENGTH 	 12

// 文件数据信息包的命令类型
/** heart beat */
#define QQ_FILE_CMD_HEART_BEAT 			 0x0001
/** heart beat的确认 */
#define QQ_FILE_CMD_HEART_BEAT_ACK 		 0x0002
/** 文件传输已完成 */
#define QQ_FILE_CMD_TRANSFER_FINISHED 		 0x0003
/** 文件操作 */
#define QQ_FILE_CMD_FILE_OP 				 0x0007
/** 文件操作的确认 */
#define QQ_FILE_CMD_FILE_OP_ACK 			 0x0008

// QQ_FILE_CMD_FILE_OP携带的信息类型
/** 文件基本信息 */
#define QQ_FILE_BASIC_INFO 	 0x1
/** 文件数据 */
#define QQ_FILE_DATA_INFO 	 0x2
/** 文件EOF */
#define QQ_FILE_EOF 	 0x3

// 文件控制信息传输包的命令类型
/** 发送者say hello */
#define QQ_FILE_CMD_SENDER_SAY_HELLO 		  	 0x0031
/** 对发送者hello的确认 */
#define QQ_FILE_CMD_SENDER_SAY_HELLO_ACK	  	 0x0032
/** 接收者say hello */
#define QQ_FILE_CMD_RECEIVER_SAY_HELLO		  	 0x0033
/** 对接受者hello的确认 */
#define QQ_FILE_CMD_RECEIVER_SAY_HELLO_ACK	  	 0x0034
/** 对通知IP的确认，即对QQ_IM_NOTIFY_IP的确认 */
#define QQ_FILE_CMD_NOTIFY_IP_ACK 			  	 0x003C
/** 试探连接 */
#define QQ_FILE_CMD_PING    				  	 0x003D
/** 试探连接的确认 */
#define QQ_FILE_CMD_PONG 					  	 0x003E
/** 主动连接对方 */
#define QQ_FILE_CMD_YES_I_AM_BEHIND_FIREWALL 	 0x0040

// 文件中转信息包的命令类型
/** 发送者请求对方提供中转服务 */
#define QQ_FILE_CMD_REQUEST_AGENT 	 0x0001
/** 接收者向中转服务器报到 */
#define QQ_FILE_CMD_CHECK_IN 	 0x0002
/** 转发包，这个包里面内嵌着一个文件数据信息包 */
#define QQ_FILE_CMD_FORWARD 	 0x0003
/** 传输结束 */
#define QQ_FILE_CMD_FORWARD_FINISHED 	 0x0004
/** 服务器通知可以开始传输数据 */
#define QQ_FILE_CMD_IT_IS_TIME 	 0x0005
/** 我已经准备好 */
#define QQ_FILE_CMD_I_AM_READY 	 0x0006

// QQ_FILE_CMD_REQUEST_AGENT命令的应答类型
/** 批准中转请求 */
#define QQ_FILE_AGENT_SERVICE_APPROVED 	 0x0000
/** 我现在忙，你找别人吧 */
#define QQ_FILE_AGENT_SERVICE_REDIRECTED 	 0x0001

// 传输类型
/** 传输文件 */
#define QQ_TRANSFER_FILE 	 0x65
/** 传输图像? */
#define QQ_TRANSFER_IMAGE	0x66
/** 传输自定义表情 */
#define QQ_TRANSFER_FACE 	 0x6B
/** 传输摄像头? */
#define QQ_TRANSFER_CAMERA	0xA1

// 请求传送文件消息中的一个标志字节，传输类型之后那个，意思不明，姑且这样
/** UDP，可能不是这意思 */
#define QQ_TRANSFER_FILE_UDP 	 0
/** 直接UDP，可能不是这意思 */
#define QQ_TRANSFER_FILE_DIRECT_UDP 	 1
/** TCP，可能不是这意思 */
#define QQ_TRANSFER_FILE_TCP 	 2
/** 直接TCP，可能不是这意思 */
#define QQ_TRANSFER_FILE_DIRECT_TCP 	 3

// 传送文件的各种情况，每种情况有其对应的连接策略，这个和协议无关，我自己定义的
/** 双方位于同一个防火墙后 */
#define QQ_SAME_LAN 	 0
/** 双方都不在防火墙后 */
#define QQ_NONE_BEHIND_FIREWALL 	 1
/** 我在防火墙后 */
#define QQ_I_AM_BEHIND_FIREWALL 	 2
/** 他在防火墙后 */
#define QQ_HE_IS_BEHIND_FIREWALL 	 3
/** 双方在不同的防火墙后 */
#define QQ_ALL_BEHIND_FIREWALL 	 4

// say hello时的hello byte，不同的情况这个字节不一样
/** 双方位于同一个防火墙后的Hello */
#define QQ_SAME_IN_TO_SAME_IN_HELLO 	 0
/** 一个人在防火墙后，内部的人是发送方时的Hello */
#define QQ_IN_TO_OUT_HELLO 	 1
/** 一个人在防火墙后，外部的人是发送方时的Hello */
#define QQ_OUT_TO_IN_HELLO 	 2
/** 两个都不在防火墙内时的Hello */
#define QQ_OUT_TO_OUT_HELLO 	 0

/** 最大的做MD5的长度，当传送一个文件时，如果这个文件很大，则只对文件的前面一部分做MD5 */
#define QQ_MAX_FILE_MD5_LENGTH 	 10002432

#endif // _QQ_H_

